/**
 * utf8字符显示库 for Adafruit_GFX
 * code by iwinyeah@163.com 2024.01.20
 */

/*============================================================
FONT 数组各部分组成如下：
1. 数组头TXT_MATRIX 16 字节
2. 汉字分段CN_SEG数组，每段1行，每行8字节 共n段n行
3. 英文点阵数组(32-127) 每字符1行，每行hBytes/2字节，共127-32+1行
4. 分段汉字点阵数组 每字符1行，每行hBytes字节
5. 落单汉字点阵数组 每字符1行，每行2+hBytes字节，首2字节为编码
6. 0xffff 最大编码表示落单汉字结束
============================================================*/

#ifndef _U8_MATRIX_H
#define _U8_MATRIX_H

#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Hardware.h>

typedef struct _CN_SEG_
{
    uint16_t fCode;    // 起始编码
    uint16_t tCode;    // 结束编码
    uint32_t cnMatrix; // 顺序汉字点阵数组 offset
} CnSeg;

typedef struct _TXT_MATRIX_
{
    uint8_t hBytes;    // 单个点阵所占字节数(ascii字符减半)
    uint8_t width;     // 字符宽度(ascii字符减半)
    uint8_t height;    // 字符高度
    uint8_t segCount;  // 汉字分段数量
    uint32_t cnSeg;    // 汉字分段表 offset
    uint32_t enMatrix; // 英文点阵数组 offset
    uint32_t cnMatrix; // 落单汉字编码+点阵数组 offset
} TxtMatrix;

class U8Matrix
{
public:
    /**
     * @brief 初始化
     */
    void begin(Adafruit_GFX &gfx);

    /**
     * @brief 设置前景色
    */
    //void setForegroundColor(uint16_t color);

    /**
     * @brief 设置背景色
    */
    //void setBackgroundColor(uint16_t color);

    /**
     * @brief 设置字体
     */
    void setFont(const uint8_t *font);

    /**
     * @brief 绘制点阵图
     */
    void drawBitmap(int cx, int cy, int w, int h, uint8_t *bitMap, uint16_t dColor = 0xffff);

    /**
     * @brief 绘制UTF-8(含ASCII)字符串
     */
    void drawUTF8(int x, int y, char const *str);

    /**
     * @brief 取UTF-8(含ASCII)字符串占宽
     */
    int getUTF8Width(char *str);
#ifdef USE_UCS2
    /**
     * @brief 将一个UTF8字符转换为ucs2编码
    */
    static int one_utf8ucs2(uint16_t *dest, uint8_t *src);

    /**
     * @brief 将一个UTF8字符串转换为ucs2编码串
    */
    static void utf8ucs2(uint16_t *dest, uint8_t *src);

    /**
     * @brief 将一个ucs编码转换为UTF8字符
    */
    static int one_ucs2utf8(uint8_t *dest, uint16_t code);

    /**
     * @brief 将一个ucs2编码串转换为UTF8字符串
    */
    static void ucs2utf8(uint8_t *dest, uint16_t *src);
#endif
private:
    // /**
    //  * @brief 计算UTF-8字符占字节数，并抽取首字节有效位
    //  */
    // int utf8Len(uint8_t *p);

    /**
     * @brief 取ASCII码点阵指针
     */
    uint8_t *locateAscii(uint16_t c);

    /**
     * @brief 取UTF-8字符点阵指针
     */
    uint8_t *locateUTF8(uint16_t cn);

    Adafruit_GFX *display;

    TxtMatrix *mx = NULL;

    const uint8_t *fontMatrix;
    //uint16_t bgColor, dtColor;
};

#endif
